// #include <bits/stdc++.h>
// using namespace std;
//滑动窗口
//一个升序区间内相邻两个元素的差值不能超过8
//升序过来降序是可以超过8的
//改的超时了
// const int N = 2e5+10;
// int a[N];
// int n;
// int main()
// {
//     cin >> n;
//     for(int i = 0; i < n; i++)cin >> a[i];
//     int maxlen = 0;
//     int count = 0;
//     for(int left = 0, right = 1; right < n;)
//     {
//         if(a[right] > a[left] && a[right] - a[left] > 8)
//         {
//             left++;
//             right++;
//             continue;
//         }
//         else if(a[right] > a[left] && a[right] - a[left] <= 8)
//         {
//             while(a[right] > a[left] && right <= n && a[right] - a[left] <= 8)
//             {
//                 right++;
//                 left++;
//                 count++;
//             }
//             if(a[right] - a[left] > 8)
//             {
//                 maxlen = max(maxlen, count + 1);
//                 continue;
//             }
//             if(a[right] < a[left])
//             {
//                 count++;
//                 left++,right++;
//                 while(right <= n && a[right] > a[left] && a[right] - a[left] <= 8)
//                 {
//                     right++;
//                     left++;
//                     count++;
//                 }
//                 maxlen = max(maxlen, count);
//             }
//             else if(right == n)
//             {
//                 maxlen = max(maxlen, count);
//                 break;
//             }
//         }
        
//     }
//     cout << (maxlen == 0 ? 1 : maxlen) << endl;
//     return 0;
// }

// #include <bits/stdc++.h>
// using namespace std;
// int a[1000];
// class Solution {
// public:
//     int n, m;
//     int dx[4] = {0, 0, 1, -1};
//     int dy[4] = {1, -1, 0, 0};
//     int maxlen=0;
//     int count=0;
//     int dfs(vector<vector<int> >& ret, int i, int j)
//     {
//         if(ret[i][j]==2)
//         {
//             a[count++]=maxlen;
//             return maxlen;
//         }
//         for(int k = 0; k < 4; k++)
//         {
//             int x = i + dx[k], y = j + dy[k]; 
//             if(x >=0 && x <n && y >=0 && y < m && ret[x][y] != -1)
//             {
//                 maxlen=max(maxlen,1+dfs(ret,x,y));
//             }
//         }
//         return maxlen
//     }
//     int countPath(vector<vector<int> >& ret, int n, int m) {
//         this->n = n;  
//         this->m = m;
//         int tempi = -1, tempj = -1;  
//         for(int i = 0; i < n; i++)
//         {
//             for(int j = 0; j < m; j++)
//             {
//                 if(ret[i][j]==1)
//                 {
//                     tempi = i;
//                     tempj = j;
//                     break;
//                 }
//             }
//             if(tempi!=-1&&tempj!=-1)break;
//         }
//         int x;
//         sort(a,a+50);
//         // int maxlen=a[0],count=1;
//         int maxlen=0;
//         int count=0;
//         for(int i=0;i<50;i++)
//         {
//             if(a[i]==0)continue;
//             if(a[i]>0)
//             {
//                 maxlen=a[i];
//                 while(i<50)
//                 {
//                     if(a[++i]==maxlen)count++;
//                     else break;
//                 }
//             }
//             if(count!=0)break;
//         }
//         return count;
//     }
// };
// int main()
// {
//     return 0;
// }

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,k;
int price[N];
//dp[i][j]以i为结尾的区间交易j次最多可以获得的收益
//最后的答案存在dp[n][k]中
int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)cin>>price[i];
    int dp[n+1][k+1];
    for(int i=0;i<=n;i++)dp[0][i]=-0x3f3f3f3f;
    for(int i=0;i<=k;i++)dp[i][0]=-0x3f3f3f3f;
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            dp[i][j]=dp[i-1][j];
            if(j-k>0)
                dp[i][j]=max(dp[i-1][j],dp[i][j]-price[i-1]+price[i]);
        }
    }
    cout<<dp[n][k]<<endl;
    return 0;
}